﻿using blackhouse.Locations;
using blackhouse.WebNemo.Business.DataTypes;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;

namespace blackhouse.WebNemo.Web.Controls {
    public class LatLngEditRecordValue : EditRecordValue {

        #region Fields

        private TextBox txtLatitude;
        private TextBox txtLongitude;

        #endregion

        #region Properties

        public override bool DisplayInline {
            get { return false; }
        }

        #endregion

        #region Methods

        protected override void CreateChildControls() {
            base.CreateChildControls();

            Label lblLatitude = new Label();
            Label lblLongitude = new Label();
            this.txtLatitude = new TextBox();
            this.txtLongitude = new TextBox();

            this.Controls.Add(lblLatitude);
            this.Controls.Add(this.txtLatitude);
            this.Controls.Add(lblLongitude);
            this.Controls.Add(this.txtLongitude);

            this.txtLatitude.ID = "txtLatitude";
            this.txtLongitude.ID = "txtLongitude";

            lblLatitude.Text = "Latitude: ";
            lblLatitude.AssociatedControlID = this.txtLatitude.ID;
            lblLongitude.Text = "Longitude: ";
            lblLongitude.AssociatedControlID = this.txtLongitude.ID;

            this.txtLatitude.Width = Unit.Pixel(200);
            this.txtLongitude.Width = Unit.Pixel(200);
            this.txtLatitude.Style.Add("margin-right", "10px");
        }

        public override BaseValidator[] GetValidators() {
            List<BaseValidator> validators = new List<BaseValidator>();

            if (!this.column.AllowNull) {
                RequiredFieldValidator validatorRequiredLatitude = new RequiredFieldValidator();
                validatorRequiredLatitude.ControlToValidate = this.txtLatitude.ID;
                validatorRequiredLatitude.ErrorMessage = "Pole " + this.column.Name + " - latitude nie może być puste!";
                validatorRequiredLatitude.Text = "Pole latitude nie może być puste!";
                validators.Add(validatorRequiredLatitude);

                RequiredFieldValidator validatorRequiredLongitude = new RequiredFieldValidator();
                validatorRequiredLongitude.ControlToValidate = this.txtLongitude.ID;
                validatorRequiredLongitude.ErrorMessage = "Pole " + this.column.Name + " - longitude nie może być puste!";
                validatorRequiredLongitude.Text = "Pole longitude nie może być puste!";
                validators.Add(validatorRequiredLongitude);
            }

            RegularExpressionValidator validatorRegularExpressionLatitude = new RegularExpressionValidator();
            validatorRegularExpressionLatitude.ControlToValidate = this.txtLatitude.ID;
            validatorRegularExpressionLatitude.ErrorMessage = "Pole " + this.column.Name + " - latitude powinno być liczbą z . jako znak dziesiętny!";
            validatorRegularExpressionLatitude.Text = "Pole latitude powinno być liczbą z . jako znak dziesiętny!";
            validatorRegularExpressionLatitude.ValidationExpression = @"^(-?)\d{1,3}(.|,)(\d){0,8}$";
            validators.Add(validatorRegularExpressionLatitude);

            RegularExpressionValidator validatorRegularExpressionLongitude = new RegularExpressionValidator();
            validatorRegularExpressionLongitude.ControlToValidate = this.txtLongitude.ID;
            validatorRegularExpressionLongitude.ErrorMessage = "Pole " + this.column.Name + " - longitude powinno być liczbą z . jako znak dziesiętny!";
            validatorRegularExpressionLongitude.Text = "Pole longitude powinno być liczbą z . jako znak dziesiętny!";
            validatorRegularExpressionLongitude.ValidationExpression = @"^(-?)\d{1,3}(.|,)(\d){0,8}$";
            validators.Add(validatorRegularExpressionLongitude);

            return validators.ToArray();
        }

        protected override void PopulateControl() {
            this.EnsureChildControls();
            Location location = this.record.GetValue(this.column.ColumnName) as Location;
            if (location != null) {
                this.txtLatitude.Text = location.Latitude.ToString();
                this.txtLongitude.Text = location.Longitude.ToString();
            }
        }

        public override void SaveInRecord() {
            double lat, lng;
            string sLat, sLng;

            sLat = Page.Request[this.txtLatitude.UniqueID].ReplaceEx(",", ".");
            sLng = Page.Request[this.txtLongitude.UniqueID].ReplaceEx(",", ".");

            if (Double.TryParse(sLat, System.Globalization.NumberStyles.AllowDecimalPoint, CultureInfo.GetCultureInfo("en-US"), out lat)
                && Double.TryParse(sLng, System.Globalization.NumberStyles.AllowDecimalPoint, CultureInfo.GetCultureInfo("en-US"), out lng)) {
                Location latLng = new Location();
                latLng.Latitude = lat;
                latLng.Longitude = lng;
                this.record.SetValue(this.column.ColumnName, latLng);
            }
        }

        #endregion

    }
}